package br.com.usapre.faces;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.business.CartaoBusiness;
import br.com.business.EmailBusiness;
import br.com.business.MotivoBloqueioBusiness;
import br.com.business.StatusCartaoBusiness;
import br.com.data.Cartao;
import br.com.data.MotivoBloqueio;
import br.com.login.faces.SessionUsaPreBean;
import br.com.utilidades.faces.SimpleMessageBean;

/**
 * @version 1.0.0
 * @since Fevereiro,28 2013
 * @author Eduardo Francisco Barbosa
 */
@Component
@Scope("view")
public class GerencieCartaoBean extends SimpleMessageBean implements Serializable {

    private static final long serialVersionUID = 6948024993590543944L;

    private SessionUsaPreBean sessionUsaPreBean;

    private CartaoBusiness cartaoBusinessImpl;
    private MotivoBloqueioBusiness motivoBloqueioBusinessImpl;
    private StatusCartaoBusiness statusCartaoBusinessImpl;

    private Cartao cartaoSelecionado;
    private List<Cartao> cartoesAdicionais;
    private List<Cartao> cartoesUsuario;

    private MotivoBloqueio motivoBloqueio;
    private List<MotivoBloqueio> motivosBloqueio;

    private String cartaoEscolhido;
    private Cartao cartao;

    private Integer opcaoMostra;

    private String novaSenha;
    private String confirmaNovaSenha;
    private String senhaAtual;

    private EmailBusiness emailBusinessImpl;

    /**
     * Construtor
     */
    @Autowired
    public GerencieCartaoBean(SessionUsaPreBean sessionUsaPreBean, StatusCartaoBusiness statusCartaoBusinessImpl,
	    CartaoBusiness cartaoBusinessImpl, MotivoBloqueioBusiness motivoBloqueioBusinessImpl,
	    EmailBusiness emailBusinessImpl) {

	this.sessionUsaPreBean = sessionUsaPreBean;

	this.emailBusinessImpl = emailBusinessImpl;

	this.cartaoBusinessImpl = cartaoBusinessImpl;
	this.motivoBloqueioBusinessImpl = motivoBloqueioBusinessImpl;
	this.statusCartaoBusinessImpl = statusCartaoBusinessImpl;

	reset();
    }

    /**
     * reset
     */
    public void reset() {
	buscarCartoes();

	cartaoEscolhido = "";

	opcaoMostra = 1;

	motivosBloqueio = motivoBloqueioBusinessImpl.buscarPorNomeBusca("");

    }

    /**
     * buscarCartoes
     */
    public void buscarCartoes() {
	// busca os cartoes do usuario logado
	cartoesUsuario = cartaoBusinessImpl.buscarCartoesPorUsuario(sessionUsaPreBean.getUsuario());

	cartoesAdicionais = new ArrayList<Cartao>();

	if (cartoesUsuario.size() == 1) {
	    cartaoSelecionado = cartoesUsuario.get(0);
	}
	if (cartoesUsuario.size() > 1) {
	    for (Cartao cartao : cartoesUsuario) {
		if (cartao.getAdicional().equals(Boolean.FALSE)) {
		    cartaoSelecionado = cartao;
		} else {
		    cartoesAdicionais.add(cartao);
		}
	    }
	}
	if (cartoesUsuario.size() == 0) {
	    cartaoSelecionado = null;
	    String usuarioNaoVinculado = super.getMensagem("MN_usuario_nao_tem_cartao_vinculado");
	    enviaMensagem(usuarioNaoVinculado, usuarioNaoVinculado);
	}
    }

    /**
     * defineCartao
     */
    public void defineCartao() {
	for (Cartao cart : cartoesUsuario) {
	    if (cart.getId() == Integer.parseInt(cartaoEscolhido)) {
		cartao = cart;
	    }
	}
    }

    /**
     * desbloquear
     */
    public void desbloquear() {

	StringBuffer corpo = new StringBuffer("O Usuario: ");
	corpo.append(sessionUsaPreBean.getUsuario().getNome());
	corpo.append(" soliticou o desbloqueio do cartão: ");
	corpo.append(cartao.getNumero());

	emailBusinessImpl.enviar("atendimento@nacionalsa.com.br", "Gereciamento Cartão USAPRE",
		"Solicitação de Desbloqueio", corpo.toString());

	String msg = super.getMensagem("MN_lembrando_alteracao_ocorrera_24_horas");
	FacesMessage fm = new FacesMessage(msg, msg);
	FacesContext.getCurrentInstance().addMessage("", fm);

	cartao.setMotivoBloqueio(null);
	cartao.setStatusCartao(statusCartaoBusinessImpl.buscarPorId(1));
	cartaoBusinessImpl.atualizar(cartao);

	buscarCartoes();
	cartaoEscolhido = "";

    }

    /**
     * bloquear
     */
    public void bloquear() {
	if (motivoBloqueio == null) {
	    String msg = super.getMensagem("MN_motivo_bloqueio_obrigatorio");
	    enviaMensagem(msg, msg);
	} else {

	    StringBuffer corpo = new StringBuffer("O Usuario: ");
	    corpo.append(sessionUsaPreBean.getUsuario().getNome());
	    corpo.append(" soliticou o bloqueio do cartão: ");
	    corpo.append(cartao.getNumero());
	    corpo.append("pelo motivo: ");
	    corpo.append(motivoBloqueio.getNome());

	    emailBusinessImpl.enviar("atendimento@nacionalsa.com.br", "Gereciamento Cartão USAPRE",
		    "Solicitação de BLOQUEIO", corpo.toString());

	    String msg = super.getMensagem("MN_lembrando_alteracao_ocorrera_24_horas");
	    enviaMensagem(msg, msg);

	    cartao.setMotivoBloqueio(motivoBloqueio);
	    cartao.setStatusCartao(statusCartaoBusinessImpl.buscarPorId(3));
	    cartaoBusinessImpl.atualizar(cartao);
	}

	buscarCartoes();
	cartaoEscolhido = "";
    }

    /**
     * segundaVia
     */
    public void segundaVia() {
	if (motivoBloqueio == null) {
	    String msg = super.getMensagem("MN_motivo_bloqueio_obrigatorio");
	    enviaMensagem(msg, msg);
	} else {

	    String msg = "Segunda Via Solicitada";
	    enviaMensagem(msg, msg);

	    StringBuffer corpo = new StringBuffer("O Usuario: ");
	    corpo.append(sessionUsaPreBean.getUsuario().getNome());
	    corpo.append(" soliticou 2 via do cartão: ");
	    corpo.append(cartao.getNumero());
	    corpo.append("pelo motivo: ");
	    corpo.append(motivoBloqueio.getNome());

	    emailBusinessImpl.enviar("atendimento@nacionalsa.com.br", "Gereciamento Cartão USAPRE",
		    "Solicitação de 2 Via", corpo.toString());

	    cartao.setMotivoBloqueio(motivoBloqueio);
	    cartao.setStatusCartao(statusCartaoBusinessImpl.buscarPorId(3));
	    cartaoBusinessImpl.atualizar(cartao);

	}

	buscarCartoes();
	cartaoEscolhido = "";
    }

    /**
     * alterarSenha
     */
    public void alterarSenha() {

	String msg = super.getMensagem("MN_alteracao_senha_sucesso");
	enviaMensagem(msg, msg);

	buscarCartoes();
	cartaoEscolhido = "";
    }

    /**
     * cancelar
     */
    public void cancelar() {
	buscarCartoes();
	cartaoEscolhido = "";
	cartao = null;
	opcaoMostra = 1;
    }

    /**
     * telaDesbloquear
     */
    public void telaDesbloquear() {
	opcaoMostra = 1;
    }

    /**
     * telaBloquear
     */
    public void telaBloquear() {
	opcaoMostra = 1;
    }

    /**
     * tela2Via
     */
    public void tela2Via() {
	opcaoMostra = 2;
    }

    /**
     * telaAlterarSenha
     */
    public void telaAlterarSenha() {
	senhaAtual = "";
	novaSenha = "";
	confirmaNovaSenha = "";
	opcaoMostra = 3;
    }

    // SETS AND GETS
    public Cartao getCartaoSelecionado() {
	return cartaoSelecionado;
    }

    public void setCartaoSelecionado(Cartao cartaoSelecionado) {
	this.cartaoSelecionado = cartaoSelecionado;
    }

    public List<Cartao> getCartoesAdicionais() {
	return cartoesAdicionais;
    }

    public void setCartoesAdicionais(List<Cartao> cartoesAdicionais) {
	this.cartoesAdicionais = cartoesAdicionais;
    }

    public List<Cartao> getCartoesUsuario() {
	return cartoesUsuario;
    }

    public void setCartoesUsuario(List<Cartao> cartoesUsuario) {
	this.cartoesUsuario = cartoesUsuario;
    }

    public String getCartaoEscolhido() {
	return cartaoEscolhido;
    }

    public void setCartaoEscolhido(String cartaoEscolhido) {
	this.cartaoEscolhido = cartaoEscolhido;
    }

    public Cartao getCartao() {
	return cartao;
    }

    public void setCartao(Cartao cartao) {
	this.cartao = cartao;
    }

    public Integer getOpcaoMostra() {
	return opcaoMostra;
    }

    public void setOpcaoMostra(Integer opcaoMostra) {
	this.opcaoMostra = opcaoMostra;
    }

    public List<MotivoBloqueio> getMotivosBloqueio() {
	return motivosBloqueio;
    }

    public void setMotivosBloqueio(List<MotivoBloqueio> motivosBloqueio) {
	this.motivosBloqueio = motivosBloqueio;
    }

    public MotivoBloqueio getMotivoBloqueio() {
	return motivoBloqueio;
    }

    public void setMotivoBloqueio(MotivoBloqueio motivoBloqueio) {
	this.motivoBloqueio = motivoBloqueio;
    }

    public String getNovaSenha() {
	return novaSenha;
    }

    public void setNovaSenha(String novaSenha) {
	this.novaSenha = novaSenha;
    }

    public String getConfirmaNovaSenha() {
	return confirmaNovaSenha;
    }

    public void setConfirmaNovaSenha(String confirmaNovaSenha) {
	this.confirmaNovaSenha = confirmaNovaSenha;
    }

    public String getSenhaAtual() {
	return senhaAtual;
    }

    public void setSenhaAtual(String senhaAtual) {
	this.senhaAtual = senhaAtual;
    }

}
